package com.ylwl.datacenterdemo.util;

import lombok.extern.slf4j.Slf4j;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.regex.Pattern;

@Slf4j
@Component
public class TableNameConverter {

    private static final Pattern NAME_PATTERN = Pattern.compile("^[a-zA-Z][a-zA-Z0-9_]*$");
    private static final HanyuPinyinOutputFormat FORMAT = new HanyuPinyinOutputFormat();

    public TableNameConverter() {
        FORMAT.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        FORMAT.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        FORMAT.setVCharType(HanyuPinyinVCharType.WITH_V);
    }

    /**
     * 将文件名转换为合法的数据库表名
     * @param fileName 原始文件名
     * @return 合法的数据库表名
     */
    public String convertToTableName(String fileName) {
        if (!StringUtils.hasText(fileName)) {
            return "default_table";
        }

        // 如果已经是合法的英文表名，直接返回
        if (NAME_PATTERN.matcher(fileName).matches()) {
            // 确保长度不超过64个字符
            if (fileName.length() > 64) {
                return fileName.substring(0, 64);
            }
            return fileName.toLowerCase();
        }

        // 获取不带扩展名的文件名（如果是文件名的话）
        String tableName = fileName;
        if (fileName.contains(".")) {
            tableName = fileName.substring(0, fileName.lastIndexOf("."));
        }

        // 转换为拼音
        StringBuilder result = new StringBuilder();
        try {
            for (char c : tableName.toCharArray()) {
                // 如果是英文字母或数字，直接添加
                if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')) {
                    result.append(c);
                }
                // 如果是中文，转换为拼音
                else if (Character.toString(c).matches("[\\u4E00-\\u9FA5]+")) {
                    String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c, FORMAT);
                    if (pinyinArray != null && pinyinArray.length > 0) {
                        result.append(pinyinArray[0]);
                    }
                }
                // 其他字符替换为下划线
                else {
                    if (result.length() > 0 && result.charAt(result.length() - 1) != '_') {
                        result.append('_');
                    }
                }
            }
        } catch (Exception e) {
            log.warn("转换表名时出错，使用原始文件名: {}", fileName, e);
            result = new StringBuilder(tableName.replaceAll("[^a-zA-Z0-9_]", "_"));
        }

        // 确保表名以字母开头
        String finalName = result.toString().toLowerCase();
        if (finalName.matches("^[0-9].*")) {
            finalName = "t_" + finalName;
        }

        // 如果表名为空或不以字母开头，使用默认名称
        if (!finalName.matches("^[a-zA-Z].*")) {
            finalName = "table_" + System.currentTimeMillis();
        }

        // 限制表名长度
        if (finalName.length() > 64) {
            finalName = finalName.substring(0, 64);
        }

        return finalName;
    }
}